<?php

if(! function_exists('exExcel')){
    /**
     * 导出多页的excel
     *
     * @param [type] $fileName 文件名
     * @param [type] $sheets  表数
     * @param [type] $Data    数据
     * @author Tan <smallcatx0@gmail.com>
     * @return File
     */
    function exExcel($fileName,$Data,$sheets='') {
        $fileName = empty($fileName) ? date('YmdHis_').mt_rand(0,200):$fileName;
        $xlsTitle =  iconv('utf-8', 'gb2312', $fileName);
        $sheets = empty($sheets) ? count($Data) : $sheets;
        \import('PHPExcel.PHPExcel',EXTEND_PATH);
        $objPHPExcel = new \PHPExcel();
        $cellName = array('A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z','AA','AB','AC','AD','AE','AF','AG','AH','AI','AJ','AK','AL','AM','AN','AO','AP','AQ','AR','AS','AT','AU','AV','AW','AX','AY','AZ');

        for ($sheet=0; $sheet < $sheets; $sheet++) {  // 多页数据
            $sheet==0 ? NULL : $objPHPExcel->createSheet();
            $objPHPExcel->setActiveSheetIndex($sheet);
            foreach($Data[$sheet] as $row_index=>$row){ // 写入行
                $i = 0;
                foreach($row as $cell){
                    // 合并单元格 并居中
                    if (is_array($cell) && isset($cell['merge'])){
                        $objPHPExcel->getActiveSheet($sheet)
                        ->mergeCells($cellName[$i].($row_index+1).':'.$cellName[$i+$cell['merge']].($row_index+1));//合并单元格
                        $objPHPExcel->getActiveSheet($sheet)
                        ->getStyle($cellName[$i].($row_index + 1))
                        ->applyFromArray(['alignment'=>['horizontal'=>PHPExcel_Style_Alignment::HORIZONTAL_CENTER]]); // 居中
                        $objPHPExcel->getActiveSheet($sheet)
                        ->setCellValue($cellName[$i].($row_index + 1),' '.$cell['text']);
                    }else{
                        $objPHPExcel->getActiveSheet($sheet)  // 写入一个单元格
                        ->setCellValue($cellName[$i].($row_index + 1),' '.$cell);  // 前面加一个空白可以将其他的数据类型转换为字符串
                    }
                    $i++;
                }
            }
        }

        header('pragma:public');
        header('Content-type:application/vnd.ms-excel;charset=utf-8;name="'.$xlsTitle.'.xls"');
        header("Content-Disposition:attachment;filename=$fileName.xls");//attachment新窗口打印 inline本窗口打印
        $objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel5');
        $objWriter->save('php://output');
        exit;
    }
}

if (! function_exists('http_get')) {

    /**
     * 发送http GET请求
     *
     * @param string $url get请求地址
     * @param int $httpCode 返回状态码
     * @return mixed
     */
    function http_get($url, &$httpCode = 0){
        $ch = curl_init();
        curl_setopt($ch, CURLOPT_URL, $url);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);

        //不做证书校验,部署在linux环境下请改为true
        curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
        curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 10);
        $file_contents = curl_exec($ch);
        $httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
        curl_close($ch);
        return $file_contents;
    }
}

if(! function_exists('http_post')){

    /**
     * 发送http POST请求
     *
     * @param string $url 请求地址
     * @param array $params 请求参数
     * @return mixed
     */
    function http_post($url, array $params=[],&$httpCode=0 ){
        $data_string = json_encode($params);
        $ch = curl_init();
        curl_setopt($ch, CURLOPT_URL, $url);
        curl_setopt($ch, CURLOPT_HEADER, 0);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
        curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 10);
        curl_setopt($ch, CURLOPT_POST, 1);
        curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
        curl_setopt($ch, CURLOPT_POSTFIELDS, $data_string);
        curl_setopt(
            $ch, CURLOPT_HTTPHEADER,
            [
                'Content-Type: application/json'
            ]
        );
        $data = curl_exec($ch);
        $httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
        curl_close($ch);
        return ($data);
    }
}

if(!function_exists('debugLog')){
    /**
     * tp5模板变量的数据调试
     *
     * @param string $title
     * @param array $data
     * @return void
     */
    function debugLog($title,$data){
        trace("-------{$title}--------",'debug');
        trace($data,'debug');
        trace("-----------------------",'debug');
    }
}

if (! function_exists('key2Value')) {
    /**
     * 按照规则，查询数据库并转换(一次查库)
     *
     * @param Array $data 元数据
     * @param Array $rule 需要转换的字段
     * @param Array $dbMap 查库依据
     * @param String $table 数据库表名
     * @author Tan <smallcatx0@gmail.com>
     * @date 2018-11-8 09:46
     * @return Array
     */
    function key2Value($data,$rule,$dbMap,$table){
        $keys = [];
        foreach ($rule as $k => $v) {
            $temp = array_column($data,$k);
            $keys = array_merge($keys,$temp);
        }
        $unKeys = array_keys(array_flip(array_filter($keys)));  // 数组合并去重
        reset($dbMap); // 指针归零
        $dbk = key($dbMap); $dbv = $dbMap[$dbk]; // 获取数据库映射关系
        // 一次性将所有需要的的用户id与用户名对应关系查询出来
        $userInfos = Db::table($table)->where([$dbk=>['in',$unKeys]])->column("$dbk,$dbv");
        foreach ($data as &$item) {
            foreach ($rule as $k => $v) {
                @ $item[$v]=$userInfos[$item[$k]];
            }
        }
        return $data;
    }
}

if (! function_exists('id2value') ) {
    /**
     * 带缓存的k-v查询方法
     *
     * @param string $id
     * @param array $dbMap
     * @param string $table
     * @return mixed
     */
    function id2value($id,$dbMap,$table){
        // 空值过滤
        if (empty($id)) return '';
        # 查询缓存
        $redisCache = Cache::store('redis');
        $value = $redisCache->get("id2value:[$table]".$id);
        if ($value) return $value;
        # 没有缓存，则查询数据并存入缓存
        reset($dbMap); // 指针归零
        $dbK = key($dbMap); $dbV = $dbMap[$dbK]; // 获取数据库映射关系
        $value = Db::table($table)->where([$dbK=>$id])->value($dbV);
        $redisCache->set("id2value:[$table]".$id,$value,7200);
        return $value;
    }
}

if (! function_exists('list_key2Value')) {
    /**
     * 按照规则，查询数据库并转换(缓存版)
     *
     * @param Array $data 元数据
     * @param Array $rule 需要转换的字段
     * @param Array $dbMap 查库依据
     * @param String $table 数据库表名
     * @author Tan <smallcatx0@gmail.com>
     * @date 2018-11-9 10:57
     * @return Array
     */
    function list_key2Value($data,$rule,$dbMap,$table){
        $kvMap = [];
        foreach ($data as &$item) {
            foreach ($rule as $k => $v) {
                if (! array_key_exists( $item[$k],$kvMap)) {  // 查询并缓存
                   $kvMap[$item[$k]] = id2value($item[$k],$dbMap,$table);
                }
                @ $item[$v]=$kvMap[$item[$k]];
            }
        }
        return $data;
    }
}

if (! function_exists('paging')) {
    /**
     * 分页信息
     *
     * @param string $table 表名
     * @param int $page 当前页码
     * @param int $limit 分页量
     * @param string $condition 条件
     * @param int|null $count 总数据量（如果传了就不再查表了）
     * @return array|false
     */
    function paging($table,$page,$limit=10,$condition='',$count=null){
        if (is_null($count)) {
            $count = Db::table($table)->where($condition)->count();
        }
        if(!$count) return false;
        $total = (int)ceil($count/$limit);
        if($page < 1) $page = 1;
        if($page > $total) $page = $total;

        return [
            'page' => $page,
            'limit' => $limit,
            'total' => $total,
            'offset' => ($page-1)*$limit
        ];
    }
}

if (! function_exists('msetime')) {
    /**
     * 获取13位时间戳，精确到毫秒
     *
     * @author Tan <smallcatx0@gmail.com>
     * @return int
     */
    function msetime(){
        list($msec, $sec) = explode(' ',microtime());
        $msectime = $sec * 1000 + intval($msec*1000) ;
        return $msectime;
    }
}

if (! function_exists('get_whereString')){
    /**
     * 兼容tp3的$where['_string']原生查询条件
     *
     * @param Array $where TP3查询条件数组
     * @author Tan <smallcatx0@gmail.com>
     * @date 2018-10-31 17:16
     * @return String
     */
    function get_whereString(&$where){
        $_string = '';
        if(isset($where['_string'])){
            $_string = $where['_string'];
            unset($where['_string']);
        }
        return $_string;
    }
}

if (! function_exists('listInsterAll')) {

    /**
     * 数据分批入库
     *
     * @param string $table 数据库名
     * @param array $data 要插入的数据
     * @param array $extra 额外的数据
     * @param integer $limit 分批的量默认500
     * @author Tan <smallcatx0@gmail.com>
     * @return void
     */
    function listInsterAll($table,$data,$extra=[],$limit=500){
        $k = 1;
        $inData = [];
        $res = false;
        foreach ($data as $v) {
            foreach ($extra as $key => $value) {
                if (is_string($key)) { // 是关联数组则增加
                    $v[$key] = $value;
                }else{ // 否则就是排除此字段
                    unset($v[$value]);
                }
            }
            $inData[] = $v;
            if ($k >= $limit) {
                $res = Db::table($table)->insertAll($inData);
                if($res === false) return false;
                $inData = [];
                $k = 0;
            }
            $k ++;
        }
        if (!empty($inData)) {
            $res = Db::table($table)->insertAll($inData);
            if($res === false) return false;
        }
        return true;
    }
}

if (! function_exists('listUpdate')) {
    /**
     * 更新数据
     *
     * @param string $table 数据库名
     * @param array $list 列表数据内容
     * @param array $extra 额外的数据
     * @param string $pk 主键
     * @author Tan <smallcatx0@gmail.com>
     * @return void
     */
    function listUpdate($table,$list,$pk,$extra=[]){
        foreach ($list as $v) {
            foreach ($extra as $key => $value) {
                if (is_string($key)) { // 是关联数组则增加
                    $v[$key] = $value;
                }else{ // 否则就是排除此字段
                    unset($v[$value]);
                }
            }
            $up = $v;
            unset($up[$pk]);
            $res = Db::table($table)->where([$pk=>$v[$pk]])->update($up);
            if($res === false) return false;
        }
        return true;
    }
}

if (! function_exists('listDelete')){
    /**
     * 标记删除数据
     *
     * @param string $table
     * @param array $list
     * @param string $pk
     * @return boolean
     */
    function listDelete($table,$list,$pk='ID'){
        if (empty($list)) {
            return true;
        }
        $ids = array_column($list,$pk);
        return Db::table($table)->where([$pk=>['IN',$ids]])->setField('isDel',1);
    }
}

if (! function_exists('code2Name')) {
    /**
     * 状态码转文字
     *
     * @param array $dataList
     * @param string $field
     * @param array $map
     * @param boolean $delet
     * @return array
     */
    function code2Name($dataList,$field,$map,$delete=true){
        $value = isset($map[$dataList[$field]]) ? $map[$dataList[$field]] : "";
        if($delete){
            $dataList[$field] = $value;
        }else{
            $dataList[$field.'Zh'] = $value;
        }
        return $dataList;
    }
}

if(! function_exists('cny')){
    /**
     * 金额转中文大写
     *
     * @param int $ns
     * @return string
     */
    function cny($ns){
        static $cnums = array("零", "壹", "贰", "叁", "肆", "伍", "陆", "柒", "捌", "玖");
        static $cnyunits = array("圆", "角", "分");
        static $grees = array("拾", "佰", "仟", "万", "拾", "佰", "仟", "亿");

        $_cny_map_unit = function ($list, $units){
            $ul = count($units);
            $xs = array();
            foreach (array_reverse($list) as $x) {
                $l = count($xs);
                if ($x != "0" || !($l % 4)) $n = ($x == '0' ? '' : $x) . ($units[($l - 1) % $ul]);
                else $n = is_numeric($xs[0][0]) ? $x : '';
                array_unshift($xs, $n);
            }
            return $xs;
        };
        list($ns1, $ns2) = explode(".", $ns, 2);
        $ns2 = array_filter(array($ns2[1], $ns2[0]));
        $ret = array_merge($ns2, array(implode("", $_cny_map_unit(str_split($ns1), $grees)), ""));
        $ret = implode("", array_reverse($_cny_map_unit($ret, $cnyunits)));
        return str_replace(array_keys($cnums), $cnums, $ret);
    }
}

if(! function_exists('listCode2Name')){
    /**
     * 批量状态吗转文字
     *
     * @param array $dataList 数据源
     * @param string $field 转换字段
     * @param array $map 转换规则字典
     * @param boolean $delet 是否替换原字段
     * @return void
     */
    function listCode2Name($dataList,$field,$map,$delet=true){
        foreach ($dataList as &$v) {
            $v = code2Name($v,$field,$map,$delet);
        }
        return $dataList;
    }
}

if (! function_exists('pdf2png')) {
    /**
     * 将pdf文件转化为多张png图片
     *
     * @param string $pdf  pdf所在路径 （/www/pdf/abc.pdf pdf所在的绝对路径）
     * @param string $path 新生成图片所在路径 (/www/pngs/)
     *
     * @return array|int
     */
    function pdf2png($pdf, $path){
        if (!extension_loaded('imagick')) {
            return -1;
        }
        if (!file_exists($pdf)) {
            return -2;
        }
        if (!file_exists($path) && !mkdir($path, 0777, true)) {
            return -3;
        }
        $im = new Imagick();
        $im->setResolution(240, 240); //设置分辨率
        $im->setCompressionQuality(120);
        $im->readImage($pdf);
        $origiName = explode('.',basename($pdf))[0]; // 原始文件名
        $fileName = $path . "{$origiName}_" . md5(time());
        foreach ($im as $k => $v) {
            $v->setImageFormat('png');
            $file = $fileName . "[{$k}].png";
            if ($v->writeImage($file) == true) {
                $return[] = $file;
            }
        }
        return $return;
    }

}

if (! function_exists('curlDownFile')) {
    /**
     * curl下载文件
     *
     * @param string $img_url
     * @param string $save_path
     * @param string $filename
     * @return void
     */
    function curlDownFile($img_url, $save_path , $filename = '') {
        if (trim($img_url) == '') return -1;
        if (trim($save_path) == '') return -2;

        //创建保存目录
        if (!file_exists($save_path) && !mkdir($save_path, 0777, true)) {
            return -3;
        }

        if (trim($filename) == '') {
            $img_ext = strrchr($img_url, '.');
            $name = explode('.',basename($img_url))[0];
            $img_exts = array('.gif', '.jpg', '.png', '.mp4', '.pdf','.doc','.docx');
            if (!in_array($img_ext, $img_exts)) {
                return -4;
            }
            $filename = $name .'_'.time() . $img_ext;
        }

        // curl下载文件
        $ch = curl_init();
        $timeout = 5;
        curl_setopt($ch, CURLOPT_URL, $img_url);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
        curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, $timeout);
        $img = curl_exec($ch);
        curl_close($ch);

        // 保存文件到制定路径
        $path = $save_path . $filename;
        file_put_contents($path, $img);
        unset($img);
        return $path;
    }
}

if (! function_exists('getExt')) {
    /**
     * 获取文件后缀名
     *
     * @param string $file 文件地址
     * @return string
     */
    function getExt($file){
        $fileInfo = pathinfo($file);
        return $fileInfo['extension'];
    }
}

